﻿using Max.PH4.Shoppgin.Admin.Domain;
using Max.PH4.Shoppgin.Admin.Domain.Shared;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Max.PH4.Shoppgin.Admin
{
    /// <summary>
    /// 订单主表
    /// </summary>
    [Table("tb_order_master")]
    public class OrderMasterEntity : AuditField
    {

        public Guid Id { get; set; }

        #region 订单号

        /*
         * 订单号是不允许重复的
         * 1、在考试的时候，会要求订单号用雪花ID
         * 2、也可以用全球唯一标识符（很少用） Guid.NewGuid().ToString("N")
         * 3、自定义业务订单号（周一 7/3来讲）
         * **/

        /// <summary>
        /// 订单号
        /// </summary>
        public string OrderNo { get; set; }
        #endregion

        #region 订单状态
        /*
         * 订单状态有哪些呢？
         * 待付款、未付款 ---------------待付款（等待买家付款）
         * 已付款、待发货----------------待发货（买家已付款，等待卖家发货）
         * 已发货------------------------待收货（卖家已发货，等待买家收货）
         * 已签收------------------------已签收（货品已寄到收件地址，并签收---不一定是本人签收，也可能是快递站代签收）
         * ------------------------------待确认（本人已拿到商品了，确认是本人收的货。默认7天后会自动确认）
         * 待评价------------------------待评价（已经确认收货了，等待买家去评论此次的订单交易）
         * 已完成------------------------已完成（订单交易结束）
         * 已关闭（没付钱、超时则关闭）--已关闭（买家在规定的时间范围内，没有及时对订单进行进行付款操作，订单则自动关闭）
         * ------------------------------已取消（买家未付款，不想要了。主动取消该订单交易）
         * ------------------------------已删除（买家只能删除已关闭、已取消的订单---只能是逻辑删除）
         * 退货中、退款中
         * **/

        /// <summary>
        /// 订单状态
        /// </summary>
        public OrderStateEnum OrderState { get; set; } = OrderStateEnum.WaittingPayment;
        #endregion

        #region 收件人信息

        /// <summary>
        /// 收件人姓名
        /// </summary>
        public string RecivedName { get; set; }

        /// <summary>
        /// 收件人电话
        /// </summary>
        public string RecivedPhone { get; set; }

        /// <summary>
        /// 收件人详细地址
        /// </summary>
        public string RecivedAddress { get; set; }
        #endregion

        /// <summary>
        /// 会员ID
        /// </summary>
        public Guid MemberId { get; set; } //这个订单是谁下的（谁买的）

        /// <summary>
        /// 下单时间
        /// </summary>
        public DateTime OrderTime { get; set; } //你什么时候买的

        /// <summary>
        /// 订单总金额
        /// </summary>
        public decimal OrderAmount { get; set; } //花了多少钱买的

        /// <summary>
        /// 折扣金额
        /// </summary>
        public decimal? RateAmount { get; set; } = 0; //优惠了多少钱

        /// <summary>
        /// 支付金额
        /// </summary>
        public decimal? PayAmount { get; set; } //你付了多少钱

        /// <summary>
        /// 支付方式
        /// </summary>
        public PayTypeEnum? PayType { get; set; } //用什么方式付的钱

        public DateTime? PayTime { get; set; } //你什么时候付的钱

        public string? Remark { get; set; } //订单备注

        public OrderMasterEntity()
        {
            this.OrderNo = CreateOrderNo();
        }

        /// <summary>
        /// 生成订单号
        /// </summary>
        /// <returns></returns>
        private string CreateOrderNo(string t="snow")
        {
            string orderNo = "";
            switch (t.ToLower())
            {
                case "snow":
                    orderNo = new Snowflake.Core.IdWorker(1, 1).NextId().ToString();
                    break;
                case "guid":
                    orderNo = Guid.NewGuid().ToString("N");
                    break;
                default:
                    //自定义订单号
                    string type = "P";
                    string date = System.DateTime.Now.ToString("yyyyMMdd");
                    //流水号，这里用随机数替代（业务会有这么一张表，专门记录流水号，每天从1开始）
                    string no = new Random().Next(1, 99999).ToString().PadLeft(5,'0');
                    orderNo = $"{type}{date}{no}";
                    break;
            }

            return orderNo;
        }
    }



}
